﻿#pragma once
#include "Singleton.h"
#include <Windows.h>
#include <memory>
#include <vector>
#include "Player.h"
#include "Vector2.h"
#include "Vector3.h"
#include "Vector4.h"

#define DIRECTINPUT_VERSION 0x0800

#include <dinput.h>
#include <tchar.h>
#include <string>
#include <fstream>
#include <dwmapi.h>
#include <d3d11.h>
#include <D3DX11tex.h>
#include "imgui/imgui.h"
#include "imgui/imgui_impl_dx11.h"
#include "imgui/imgui_impl_win32.h"

#pragma comment(lib,"Dwmapi.lib")

// 进程和窗口的一些信息
#define OVERLAY_WIN_CLASS "QQDLG"
#define OVERLAY_WIN_NAME "QQVip"
#define GAME_WIN_CLASS "UnrealWindow"
#define GAME_WIN_NAME "Battle Royale Trainer  "
#define PROCESS_NAME "BattleRoyaleTrainer-Win64-Shipping.exe"
#define MODULE_NAME "BattleRoyaleTrainer-Win64-Shipping.exe"

using namespace std;

class GlobalVars : public Singleton <GlobalVars>
{
public:
	// 游戏进程ID
	DWORD pId;
	// 游戏进程句柄
	HANDLE hProcess;

	// 游戏窗口的句柄
	HWND hWindow;
	// 遮罩窗口的句柄
	HWND overlayHWindow;

	// 游戏模块基址
	uintptr_t baseAddr;
	// 世界地址
	uintptr_t worldAddr;
	// 摄像机矩阵地址
	uintptr_t viewMatrixAddr;

	// ULevel地址
	uintptr_t uLevelAddr;
	// Actor数量
	int actorCount;
	// Actor数组地址
	uintptr_t actorsAddr;

	struct Offsets
	{
		DWORD world = 0x02AEFFB8; // 世界基址
		DWORD viewMatrix = 0x02886630; // 矩阵基址

		DWORD viewMatrix_offset1 = 0x20; // 矩阵偏移1
		DWORD viewMatrix_offset2 = 0x280; // 矩阵偏移2

		DWORD level_offset = 0x30; // ULevel偏移
		DWORD count_offset = 0xB8; // Count偏移
		DWORD actors_offset = 0xB0; // Actors数组偏移

		DWORD playerHp_offset = 0x7C4; // 血量偏移
		DWORD playerSpeed_offset = 0xC0; // 玩家速度偏移
		DWORD playerFlag1_offset = 0x150; // 玩家类型偏移 150 3-自己 1-敌人 0-模型
		DWORD playerFlag2_offset = 0x50; // 玩家类型偏移 1-人物 0-模型

		DWORD playerOrigin_offset = 0x158; // 玩家坐标偏移
		DWORD playerOriginX_offset = 0x190; // 玩家X坐标偏移
		DWORD playerOriginY_offset = 0x194; // 玩家Y坐标偏移
		DWORD playerOriginZ_offset = 0x198; // 玩家Z坐标偏移

		DWORD playerMesh_offset = 0x378; // 玩家网格偏移
		DWORD playerSkeletonMatrix_offset = 0x180; // 玩家骨骼矩阵偏移
		DWORD playerSkeletonArray_offset = 0x698; // 玩家骨骼数组偏移

		DWORD bullet = 0x02AEFFB8;
		DWORD bullet_offset1 = 0xF0;
		DWORD bullet_offset2 = 0x3D8;
		DWORD bullet_offset3 = 0x148; // 武器1，每个武器偏移8字节
		DWORD bullet_count_offset = 0x568; // 枪械结构里的子弹数量偏移
		DWORD gun_recoil_x_offset = 0x68; // 水平方向后坐力，在子弹数量偏移基础上增加偏移量
		DWORD gun_recoil_y_offset = 0x30; // 垂直方向后坐力，在子弹数量偏移基础上增加偏移量
		DWORD gun_jitter_offset = 0x28; // 枪械抖动，在子弹数量偏移基础上增加偏移量

	} ofs;

	// 透视绘制窗口区域
	struct DrawRect
	{
		int x;
		int y;
		int width;
		int height;
		int centerX;
		int centerY;
	} drawRect;

	// 还活着的敌人数量
	int activeEnemyCounter = 0;
	// 敌人数组
	shared_ptr<Player> enemyList[100] = { 0 };
	// 自己
	shared_ptr<Player> localPlayer = nullptr;

	// 更新所有玩家
	void updatePlayerList();

	// 打印地址偏移
	void printOffsets();
};
